/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ejemplotiendaweb.controlador;

import ejb.datos.ClienteFacadeRemote;
import ejb.excepciones.ExcepcionExistencias;
import ejb.negocio.CompraFacadeRemote;
import ejb.negocio.ProductoCompra;
import ejemplotiendawebswing.Compra;
import entidades.Cliente;
import entidades.Pedido;
import entidades.Producto;
import java.text.NumberFormat;
import java.util.List;
import javax.swing.JComboBox;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author ccia
 */
public class CompraController extends ControladorGui<Compra> {

    private CompraFacadeRemote compraFacade;
    private ClienteFacadeRemote clienteFacade;
    private List<Cliente> listaClientes;
    private PrincipalController principalControlador;
    private NumberFormat numberFormat;

    public CompraController(Compra compraFrame, CompraFacadeRemote compraRemote,
            ClienteFacadeRemote clienteFacade, PrincipalController principalControlador) {
        super(compraFrame);
        this.compraFacade = compraRemote;
        this.clienteFacade = clienteFacade;
        this.principalControlador = principalControlador;
        numberFormat = NumberFormat.getNumberInstance();
        numberFormat.setMinimumFractionDigits(2);
        numberFormat.setMaximumFractionDigits(2);

    }

   

    @Override
    public void inicializar() {
        compraFacade.inicializarCarroCompra();
        gui.setControlador(this);
        listaClientes = clienteFacade.buscarTodos();
        compraFacade.inicializarCarroCompra();
        gui.setControlador(this);
        listaClientes = clienteFacade.buscarTodos();
        actualizarUi();
    }

    private void actualizarUi() {
        actualizarMonto();
        llenarComboClientes();
        llenarTabla();
    }

    private void llenarTabla() {
        DefaultTableModel modelo = gui.getModel();

        modelo.setRowCount(0);

        List<ProductoCompra> datos = compraFacade.obtenerCarroCompra();

        for (ProductoCompra producto : datos) {
            Object[] fila = {producto.getProducto().getDescripcion(),
            producto.getCantidad(),
            producto.getProducto().getPrecio() * producto.getCantidad()};
            modelo.addRow(fila);
        }
    }

    private void actualizarMonto() {
        double monto = compraFacade.calcularImporteTotal();
        gui.setCampoMonto(numberFormat.format(monto));
     
    }

    void comprar(Producto producto, int cantidad) {
        compraFacade.anadirProducto(producto.getId(), cantidad);
        actualizarUi();
    }

    public void eliminarProducto(int selectedRow) {
        if (selectedRow == -1) {
            mensajeError("Debe seleccionar un item de la tabla");
            return;
        }

        ProductoCompra prod = compraFacade.obtenerCarroCompra().get(selectedRow);
        compraFacade.eliminarProducto(prod.getProducto().getId());

        actualizarUi();
    }

    private void llenarComboClientes() {
        JComboBox combo = gui.getComboClientes();
        combo.removeAllItems();

        for (Cliente cliente : listaClientes) {
            combo.addItem(cliente.getUsuario().getLogin());
        }
    }

    public void generarCompra() {

        int clienteSeleccionado = gui.getComboClientes().getSelectedIndex();
        if (clienteSeleccionado == -1) {
            mensajeError("Debe seleccionar un cliente");
            return;
        }

        compraFacade.establecerCliente(listaClientes.get(clienteSeleccionado).getId());

        try {
            compraFacade.confirmarCarro();
            Pedido ped = compraFacade.generarPedido();
            super.mensaje("Pedido realizado");
            actualizarUi();
            principalControlador.rellenarTabla();
        } catch (ExcepcionExistencias ex) {
            mensajeError("No hay stock disponible para:"+ex.getDescripcionProducto());
            return;
        }
    }
}
